#include "StdAfx.h"
//-------------------------------------------------------------------------------------------------
//SqlProc.cpp  - SQL Statement Processing       
//-------------------------------------------------------------------------------------------------
//FreeBSD License
//Copyright 2011 Will Stott All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are
//permitted provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright notice, this list of
//      conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright notice, this list
//      of conditions and the following disclaimer in the documentation and/or other materials
//      provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY Will Stott ``AS IS'' AND ANY EXPRESS OR IMPLIED
//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Will Stott OR
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//The views and conclusions contained in the software and documentation are those of the
//authors and should not be interpreted as representing official policies, either expressed
//or implied, of Will Stott.
//
//----Authors--------------------------------------------------------------------------------------
//created by: will.stott@ucl.ac.uk May 2011
//
//----Comments-------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------
#include "SqlProc.h"

#include <iostream>
#include <fstream>
#include <string>

const int SqlProc::MAX_SQLSTATEMENTLEN;

SqlProc::~SqlProc(void)
{
	ClearStatements();
}

SqlProc::SqlProc(void)
{

}

bool SqlProc::OpenStatementsFile(const wchar_t *dataPathFilename)
{
	using std::ifstream;
	using std::string;
	using std::basic_string;

	bool rc = false;

	ifstream statementsFile;
	statementsFile.open (dataPathFilename, std::ios::in ); 
	if (statementsFile.is_open()) 
	{
		rc = true;
		string sqlTemplate, sqlStatement;
		basic_string <char>::size_type indexSubs = string::npos;
		char buff[MAX_SQLSTATEMENTLEN];
		while (statementsFile.getline(buff, MAX_SQLSTATEMENTLEN) )
		{
			string lineTxt(buff);
			if (lineTxt.length() == MAX_SQLSTATEMENTLEN )
			{
				rc = false;
				break;
			}
			if ((lineTxt[0] != '%')	&& (lineTxt.length() > 0))	//ignore comment lines or empty lines 
			{
				if ((lineTxt[0] != '@'))
				{
					sqlTemplate = lineTxt;
					indexSubs = sqlTemplate.find("@1");
				}
				else
				{
					sqlStatement = sqlTemplate;	
					if ( indexSubs != string::npos )
						sqlStatement.replace(indexSubs, 2, &lineTxt[3]);	//create statement with substitution, if statement line followed by @1=
					PushStatement(sqlStatement);
				}
			}
		}
		statementsFile.close();
	}
	return rc;
}

void SqlProc::ClearStatements()
{
	std::wstring *p;
	std::vector<std::wstring *>::iterator iter = _Statements.begin();
	while( iter != _Statements.end() ) 
	{
		p = *iter;
		delete *iter;
		++iter;
	}
	_Statements.clear();
}

void SqlProc::PushStatement(std::string sqlStatement)
{
	std::wstring *pSqlStatement = pSqlStatement = new std::wstring(sqlStatement.length(), L' ');
	std::copy(sqlStatement.begin(), sqlStatement.end(), pSqlStatement->begin());
	_Statements.push_back(pSqlStatement);
}

//-------------------------------------------------------------------------------------------------
//			E N D   O F   F I L E
//-------------------------------------------------------------------------------------------------
